home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmiSoft / Dev / Src / Gl_bmp_load.lha / GL_BMP_Load / BMP_Cube.c < prev    next >
C/C++ Source or Header  |  2002-12-30  |  10KB  |  344 lines

  1. /*  BMP_Cube.c
  2.  *  Rotating and bouncing textured cube
  3.  *  Demonstrates using of BMP Texture Loader routines
  4.  *  Author: Norman Walter
  5.  *  e-mail: walternn@studi.informatik.uni-stuttgart.de
  6.  *  www: http://www.norman-interactive.com
  7.  *  Date: 29.12.2002
  8.  *
  9.  *  DISCLAIMER: This software is provided "as is".  No representations or
  10.  *  warranties are made with respect to the accuracy, reliability, performance,
  11.  *  currentness, or operation of this software, and all use is at your own risk.
  12.  *
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18. #include <GL/glut.h>
  19.  
  20. /* AmigaOS includes */
  21. #include <exec/types.h>
  22.  
  23. /* Our includes */
  24.  
  25. #include "bmp.h"
  26. #include "bmp.c"
  27.  
  28. #include "Requesters.h"
  29. #include "Requesters.c"
  30.  
  31. /* 2.0 Version string for c:Version to find */
  32. UBYTE vers[] = "\0$VER: BMP Cube 1.0";
  33.  
  34. /* Global Variables */
  35.  
  36. GLfloat angle = 0.0;  // angle for rotation
  37. static GLboolean Animate = GL_TRUE;
  38.  
  39. /* Variables for GLUT menu */
  40.  
  41. #define ANIMATE 10
  42. #define POINT_FILTER 20
  43. #define LINEAR_FILTER 21
  44. #define ABOUT 40
  45. #define QUIT 100
  46.  
  47. /* Texture Information */
  48.  
  49. #define TEXTURE1 "data/Cover1.bmp"
  50. #define TEXTURE2 "data/Cover2.bmp"
  51. #define TEXTURE3 "data/Cover3.bmp"
  52. #define TEXTURE4 "data/Cover4.bmp"
  53.  
  54. BITMAPINFOHEADER    Cover1Info;            // Cover1 texture info header
  55. BITMAPINFOHEADER    Cover2Info;            // Cover2 texture info header
  56. BITMAPINFOHEADER    Cover3Info;            // Cover3 texture info header
  57. BITMAPINFOHEADER    Cover4Info;            // Cover4 texture info header
  58.  
  59. unsigned char*    Cover1Texture;    // Cover1 texture data
  60. unsigned char*        Cover2Texture;    // Cover2 texture data
  61. unsigned char*        Cover3Texture;    // Cover3 texture data
  62. unsigned char*        Cover4Texture;    // Cover4 texture data
  63.  
  64. unsigned int        Cover1;        // the Cover1 texture object
  65. unsigned int        Cover2;            // the Cover2 texture object
  66. unsigned int        Cover3;            // the Cover3 texture object
  67. unsigned int        Cover4;            // the Cover4 texture object
  68.  
  69. /* Variable for display list */
  70. static GLuint Cube;
  71.  
  72. /* Put a Cube object into the display list */
  73. static void Init_Cube(void)
  74. {
  75.  
  76.    GLUquadricObj *q = gluNewQuadric();
  77.    Cube = glGenLists(1);
  78.  
  79.    glNewList(Cube, GL_COMPILE);
  80.  
  81.      /* Cube */
  82.      gluQuadricNormals(q, GL_SMOOTH);
  83.      gluQuadricTexture(q, GL_TRUE);
  84.  
  85.      glBindTexture(GL_TEXTURE_2D, Cover1);
  86.  
  87.         glBegin(GL_QUADS);  // top face
  88.             glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
  89.             glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
  90.             glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);
  91.             glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
  92.         glEnd();
  93.  
  94.      glBindTexture(GL_TEXTURE_2D, Cover2);
  95.  
  96.         glBegin(GL_QUADS);  // front face
  97.             glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
  98.             glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
  99.             glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
  100.             glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
  101.         glEnd();
  102.  
  103.      glBindTexture(GL_TEXTURE_2D, Cover3);
  104.  
  105.         glBegin(GL_QUADS);  // right face
  106.             glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
  107.             glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
  108.             glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f);
  109.             glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);
  110.         glEnd();
  111.  
  112.      glBindTexture(GL_TEXTURE_2D, Cover4);
  113.  
  114.         glBegin(GL_QUADS);  // left face
  115.             glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
  116.             glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
  117.             glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
  118.             glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
  119.         glEnd();
  120.  
  121.         glBegin(GL_QUADS);  // bottom face
  122.             glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
  123.             glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
  124.             glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
  125.             glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);
  126.         glEnd();
  127.  
  128.         glBegin(GL_QUADS);  // back face
  129.             glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
  130.             glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
  131.             glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
  132.             glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
  133.         glEnd();
  134.  
  135.    glEndList();
  136.  
  137.    gluDeleteQuadric(q);
  138.  
  139. }
  140.  
  141. /* Load and init texture */
  142.  
  143. BOOL LoadTextures()
  144. {
  145.     // load the Cover1 texture data
  146.     Cover1Texture = LoadBMP(TEXTURE1, &Cover1Info);
  147.     if (!Cover1Texture)
  148.         return FALSE;
  149.  
  150.     // load the Cover2 texture data
  151.     Cover2Texture = LoadBMP(TEXTURE2, &Cover2Info);
  152.     if (!Cover2Texture)
  153.         return FALSE;
  154.  
  155.     // load the Cover3 texture data
  156.     Cover3Texture = LoadBMP(TEXTURE3, &Cover3Info);
  157.     if (!Cover3Texture)
  158.         return FALSE;
  159.  
  160.     // load the Cover4 texture data
  161.     Cover4Texture = LoadBMP(TEXTURE4, &Cover4Info);
  162.     if (!Cover4Texture)
  163.         return FALSE;
  164.  
  165.     // generate the Cover1 texture as a mipmap
  166.     glGenTextures(1, &Cover1);
  167.     glBindTexture(GL_TEXTURE_2D, Cover1);
  168.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  169.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  170.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover1Info.biWidth, Cover1Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover1Texture);
  171.  
  172.     // generate the Cover2 texture as a mipmap
  173.     glGenTextures(1, &Cover2);
  174.     glBindTexture(GL_TEXTURE_2D, Cover2);
  175.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  176.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  177.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  178.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  179.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover2Info.biWidth, Cover2Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover2Texture);
  180.  
  181.     // generate the Cover3 texture as a mipmap
  182.     glGenTextures(1, &Cover3);
  183.     glBindTexture(GL_TEXTURE_2D, Cover3);
  184.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  185.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  186.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  187.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  188.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover3Info.biWidth, Cover3Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover3Texture);
  189.  
  190.     // generate the Cover4 texture as a mipmap
  191.     glGenTextures(1, &Cover4);
  192.     glBindTexture(GL_TEXTURE_2D, Cover4);
  193.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  194.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  195.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  196.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  197.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover4Info.biWidth, Cover4Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover4Texture);
  198.  
  199.     return TRUE;
  200. }
  201.  
  202. /* CleanUp memory */
  203. void CleanUp()
  204. {
  205.     free(Cover1Texture);
  206.     free(Cover2Texture);
  207.     free(Cover3Texture);
  208.     free(Cover4Texture);
  209. }
  210.  
  211. /* Simple init routine */
  212. void Initialize(void)
  213. {
  214.     glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
  215.  
  216.     glShadeModel(GL_SMOOTH);            // use smooth shading
  217.     glEnable(GL_DEPTH_TEST);            // hidden surface removal
  218.     glEnable(GL_CULL_FACE);                // do not calculate inside of poly's
  219.     glFrontFace(GL_CCW);                   // counter clock-wise polygons are out
  220.  
  221.    /* fitering = nearest, initially */
  222.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  223.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  224.  
  225.    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  226.    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  227.  
  228.    if (LoadTextures())          // Load all textures
  229.    {
  230.       glEnable(GL_TEXTURE_2D);  // enable textures
  231.    }
  232.    else
  233.    {
  234.       ShowError();              // display error requester
  235.    }
  236.  
  237. }
  238.  
  239. /* Render the Scene */
  240. void Render(void)
  241. {
  242.     // clear screen and depth buffer
  243.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  244.  
  245.    glPushMatrix();
  246.  
  247.     glTranslatef(0.0f, 0.0f, 0.0f);        // perform transformations
  248.  
  249.     glRotatef(angle, 1.0f, 0.0f, 0.0f);    // place cube at (0,-3) and rotate it
  250.     glRotatef(angle, 0.0f, 1.0f, 0.0f);
  251.     glRotatef(angle, 0.0f, 0.0f, 1.0f);
  252.  
  253.    glScalef(30.0, 30.0, 30.0);
  254.  
  255.    glCallList(Cube);  // call object from display list
  256.  
  257.    glPopMatrix();
  258.  
  259.     glutSwapBuffers();  // bring backbuffer to foreground
  260. }
  261.  
  262. /* Idle function */
  263. void Idle(void)
  264. {
  265.    if (Animate)
  266.    {
  267.        if (angle >= 360.0)
  268.            angle = 0.0;
  269.           angle+=1.0;
  270.  
  271.        glutPostRedisplay();
  272.     }
  273. }
  274.  
  275. /* Reshape function */
  276. static void Reshape( int width, int height )
  277. {
  278.    glViewport( 0, 0, width, height );
  279.    glMatrixMode( GL_PROJECTION );
  280.    glLoadIdentity();
  281.    glFrustum( -5.0, 5.0, -5.0, 5.0, 10.0, 100.0 );
  282.    glMatrixMode( GL_MODELVIEW );
  283.    glLoadIdentity();
  284.    glTranslatef( 0.0, 0.0, -70.0 );
  285. }
  286.  
  287. /* Menu function for GLUT menu */
  288. static void ModeMenu(int entry)
  289. {
  290.    if (entry==ANIMATE) {
  291.       Animate = !Animate;
  292.    }
  293.    else if (entry==POINT_FILTER) {
  294.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  295.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  296.    }
  297.    else if (entry==LINEAR_FILTER) {
  298.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  299.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  300.    }
  301.    else if (entry==ABOUT) {
  302.       ShowAbout();
  303.    }
  304.    else if (entry==QUIT) {
  305.       AskQuit();
  306.    }
  307.  
  308.    glutPostRedisplay();
  309. }
  310.  
  311. /* MAIN function */
  312. int main( int argc, char *argv[] )
  313. {
  314.  
  315.    glutInit( &argc, argv );
  316.    glutInitWindowSize( 300, 300 );
  317.  
  318.    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  319.  
  320.    glutCreateWindow(argv[0] );
  321.  
  322.    /* Init everything */
  323.    Initialize();
  324.    Init_Cube();
  325.  
  326.    glutReshapeFunc(Reshape);
  327.    glutDisplayFunc(Render);
  328.    glutIdleFunc(Idle);
  329.  
  330.    /* Create GLUT Menu */
  331.    glutCreateMenu(ModeMenu);
  332.    glutAddMenuEntry("Point Filtered", POINT_FILTER);
  333.    glutAddMenuEntry("Linear Filtered", LINEAR_FILTER);
  334.    glutAddMenuEntry("Toggle Animation", ANIMATE);
  335.    glutAddMenuEntry("About", ABOUT);
  336.    glutAddMenuEntry("Quit", QUIT);
  337.    glutAttachMenu(GLUT_RIGHT_BUTTON);
  338.  
  339.    glutMainLoop();
  340.  
  341.    CleanUp();
  342.  
  343.    return 0;
  344. }